* Игра ЖИЗНЬ. * Программа КОНЦЕПТ, 26.09.2013, www.gendoc.ru присвоить РАЗМЕР_ПОЛЯ 15 присвоить РАЗМЕР_ЯЧЕЙКИ 30 присвоить МНОЖЕСТВО_ЯЧЕЕК {} присвоить НОМЕР_ПОКОЛЕНИЯ 1 присвоить ЦВЕТ_РОЖДЕНИЯ [$Синий] присвоить МЕНЯТЬ_ЦВЕТ_ПОКОЛЕНИЙ 1 Решетка_создать ПОЛЕ_ПРОТОТИП сущность ПОЛЕ ПОЛЕ_ПРОТОТИП столбцов [РАЗМЕР_ПОЛЯ] строк [РАЗМЕР_ПОЛЯ] ширина_ячейки [РАЗМЕР_ЯЧЕЙКИ] высота_ячейки [РАЗМЕР_ЯЧЕЙКИ] создать память очистить ПОЛЕ_ПРОТОТИП Решетка_рассчитать ПОЛЕ Решетка_рисовать ПОЛЕ * Начальная фигура Рождение_ячейки 10 8 1 Рождение_ячейки 4 8 1 Рождение_ячейки 5 8 1 Рождение_ячейки 6 8 1 Рождение_ячейки 7 10 1 Рождение_ячейки 7 11 1 Рождение_ячейки 7 12 1 Рождение_ячейки 7 4 1 Рождение_ячейки 7 5 1 Рождение_ячейки 7 6 1 Рождение_ячейки 8 8 1 Рождение_ячейки 9 8 1 присвоить гор1 500 гор2 600 Рисовать_кнопку [гор1] 50 [гор2] 100 [$Салатовый] Шаг Рисовать_кнопку [гор1] 100 [гор2] 150 [$Салатовый] Загрузить Рисовать_кнопку [гор1] 150 [гор2] 200 [$Салатовый] Сохранить Рисовать_кнопку [гор1] 200 [гор2] 250 [$Салатовый] Очистить Рисовать_кнопку [гор1] 250 [гор2] 300 [$Розовый] Выход рисовать текстВПрямоугольнике 480 300 620 400 'Кликая мышью, можно менять состояние клеток.' память очистить гор1 гор2 Обновить_номер_поколения функция _$ВЫБОР * показать сообщение "[_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;РЕЖИМ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР]" выбрать [_$ВЫБОР;ОБЪЕКТ] вариант ПОЛЕ Решетка_определить_ячейку [_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР] Инвертировать_ячейку (Решетка_определить_ячейку [_$ВЫБОР;ОБЪЕКТ] [_$ВЫБОР;ГОР] [_$ВЫБОР;ВЕР] ) вариант Шаг Новое_поколение вариант Загрузить Ячейки_загрузить вариант Сохранить Ячейки_сохранить вариант Очистить Ячейки_очистить вариант Выход рисовать конец СТОП конецВыбора возврат функция Инвертировать_ячейку коорд память локальный гор вер список взять гор [коорд] 1 список взять вер [коорд] 2 если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" ) Гибель_ячейки [гор] [вер] иначе Рождение_ячейки [гор] [вер] [НОМЕР_ПОКОЛЕНИЯ] конец возврат функция Рождение_ячейки гор вер итерация присвоить "ЯЧЕЙКА;[гор];[вер]" [итерация] множество или МНОЖЕСТВО_ЯЧЕЕК $ "{[гор];[вер]}" Решетка_рисовать_фигуру ПОЛЕ ячейка [гор] [вер] [ЦВЕТ_РОЖДЕНИЯ] возврат функция Гибель_ячейки гор вер память очистить "ЯЧЕЙКА;[гор];[вер]" множество разность МНОЖЕСТВО_ЯЧЕЕК $ "{[гор];[вер]}" Решетка_рисовать_фигуру ПОЛЕ ячейка [гор] [вер] [$Белый] возврат функция Новое_поколение память локальный гор вер присвоить МНОЖЕСТВО_ДОБАВИТЬ {} МНОЖЕСТВО_УДАЛИТЬ {} увеличить НОМЕР_ПОКОЛЕНИЯ Обновить_номер_поколения для гор (список сгенерить $результат 1 [ПОЛЕ;столбцов] ) для вер (список сгенерить $результат 1 [ПОЛЕ;строк] ) присвоить соседей (Количество_соседей [гор] [вер] ) если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" ) * Клетка заполнена если [соседей] < 2 множество или МНОЖЕСТВО_УДАЛИТЬ $ "{[гор];[вер]}" конец если [соседей] > 3 множество или МНОЖЕСТВО_УДАЛИТЬ $ "{[гор];[вер]}" конец иначе * Клетка пустая если [соседей] = 3 множество или МНОЖЕСТВО_ДОБАВИТЬ $ "{[гор];[вер]}" конец конец следующий следующий если [МЕНЯТЬ_ЦВЕТ_ПОКОЛЕНИЙ] список выбратьСлучайный ЦВЕТ_РОЖДЕНИЯ "[$Синий];[$Красный];[$Желтый];[$Зеленый];[$Черный]" конец для [МНОЖЕСТВО_ДОБАВИТЬ] список взять гор [$ОбъектЦикла] 1 список взять вер [$ОбъектЦикла] 2 Рождение_ячейки [гор] [вер] [НОМЕР_ПОКОЛЕНИЯ] следующий для [МНОЖЕСТВО_УДАЛИТЬ] список взять гор [$ОбъектЦикла] 1 список взять вер [$ОбъектЦикла] 2 Гибель_ячейки [гор] [вер] следующий возврат функция Количество_соседей гор вер память локальный рез присвоить рез 0 увеличить рез (Проверь_соседа [гор] [вер] -1 -1 ) увеличить рез (Проверь_соседа [гор] [вер] -1 0 ) увеличить рез (Проверь_соседа [гор] [вер] -1 1 ) увеличить рез (Проверь_соседа [гор] [вер] 0 -1 ) увеличить рез (Проверь_соседа [гор] [вер] 0 1 ) увеличить рез (Проверь_соседа [гор] [вер] 1 -1 ) увеличить рез (Проверь_соседа [гор] [вер] 1 0 ) увеличить рез (Проверь_соседа [гор] [вер] 1 1 ) присвоить $результат [рез] возврат функция Проверь_соседа гор вер смещ_гор смещ_вер память локальный рез увеличить гор [смещ_гор] увеличить вер [смещ_вер] если (память существует $результат "ЯЧЕЙКА;[гор];[вер]" ) присвоить рез 1 иначе присвоить рез 0 конец присвоить $результат [рез] возврат функция Ячейки_очистить для [МНОЖЕСТВО_ЯЧЕЕК] список взять гор [$ОбъектЦикла] 1 список взять вер [$ОбъектЦикла] 2 Гибель_ячейки [гор] [вер] следующий присвоить НОМЕР_ПОКОЛЕНИЯ 1 Обновить_номер_поколения присвоить ЦВЕТ_РОЖДЕНИЯ [$Синий] возврат функция Ячейки_загрузить память локальный гор вер строка ввести переменная имя_файла 'Загрузить из файла:' 1 если [$УспешныйВвод] Ячейки_очистить файл читать "[$ТекущийКаталог][имя_файла].fld" файл читатьСтроку НОМЕР_ПОКОЛЕНИЯ Обновить_номер_поколения файл читатьСтроку строка пока [$СтрокаПрочитана] список взять гор [строка] 1 список взять вер [строка] 2 список взять строка [строка] 3 Рождение_ячейки [гор] [вер] [строка] файл читатьСтроку строка цикл файл конецЧтения показать сообщение Загрузил! конец возврат функция Ячейки_сохранить память локальный гор вер ввести переменная имя_файла 'Сохранить в файл:' 1 если [$УспешныйВвод] файл писать "[$ТекущийКаталог][имя_файла].fld" >[НОМЕР_ПОКОЛЕНИЯ] для [МНОЖЕСТВО_ЯЧЕЕК] список взять гор [$ОбъектЦикла] 1 список взять вер [$ОбъектЦикла] 2 >[гор];[вер];[ЯЧЕЙКА;[гор];[вер]] следующий файл конецЗаписи показать сообщение Сохранил! конец возврат функция Обновить_номер_поколения присвоить $ЦветТекста [$Черный] $ЦветКисти [$Белый] $ТипКисти 1 $ЦветЛинии [$Белый] рисовать прямоугольник 500 0 600 50 рисовать текстВПрямоугольнике 500 0 600 50 "Поколение: [НОМЕР_ПОКОЛЕНИЯ]" возврат ****************************************************** *** БИБЛИОТЕКА ГРАФИКА ****************************************************** функция Рисовать_кнопку x1 y1 x2 y2 цвет текст присвоить $ТолщинаЛинии 1 $ЦветЛинии [цвет] $ЦветКисти [цвет] $ТипКисти 1 рисовать прямоугольник [x1] [y1] [x2] [y2] присвоить $ТипКисти 2 $ЦветЛинии 1 рисовать прямоугольник [x1] [y1] [x2] [y2] присвоить $ТипКисти 2 $ЦветТекста 1 $ТипТекста 0 рисовать текстВПрямоугольнике [x1] [y1] [x2] [y2] [текст] рисовать добавитьСенсор [x1] [y1] [x2] [y2] [текст] возврат функция Рисовать_кнопки список_кнопок память локальный x1 y1 x2 y2 y3 присвоить x1 850 y1 0 x2 1200 y2 40 y3 30 для [список_кнопок] Рисовать_кнопку [x1] [y1] [x2] (вычислить + $результат [y1] [y2] ) 16 [$ОбъектЦикла] увеличить y1 [y2] * увеличить y1 -1 следующий присвоить $ТипКисти 1 $ЦветКисти 16 $ЦветЛинии [$ЦветКисти] рисовать прямоугольник [x1] [y1] [x2] 5000 возврат ****************************************************** *** БИБЛИОТЕКА РЕШЕТКА ****************************************************** функция Решетка_создать решетка сущность [решетка] коорд_гор_1 0 коорд_вер_1 [[решетка];коорд_гор_1] столбцов 10 строк [[решетка];столбцов] ширина_ячейки 30 высота_ячейки [[решетка];ширина_ячейки] толщина_линии 1 цвет_фона [$белый] цвет_линии [$черный] создать возврат функция Решетка_рассчитать решетка вычислить + "[решетка];коорд_гор_2" [[решетка];коорд_гор_1] (вычислить * $результат [[решетка];столбцов] [[решетка];ширина_ячейки] ) вычислить + "[решетка];коорд_вер_2" [[решетка];коорд_вер_1] (вычислить * $результат [[решетка];строк] [[решетка];высота_ячейки] ) возврат функция Решетка_рисовать решетка память локальный смещение присвоить $ЦветКисти [[решетка];цвет_фона] $ЦветЛинии [[решетка];цвет_линии] присвоить $ТипКисти 1 $ТипЛинии 1 $ТолщинаЛинии [[решетка];толщина_линии] рисовать прямоугольник [[решетка];коорд_гор_1] [[решетка];коорд_вер_1] [[решетка];коорд_гор_2] [[решетка];коорд_вер_2] если [[решетка];толщина_линии] > 0 * Разделители столбцов присвоить смещение [[решетка];коорд_гор_1] для (список сгенерить $результат 0 [[решетка];столбцов] ) рисовать линия [смещение] [[решетка];коорд_вер_1] [смещение] [[решетка];коорд_вер_2] увеличить смещение [[решетка];ширина_ячейки] следующий * Разделители строк присвоить смещение [[решетка];коорд_вер_1] для (список сгенерить $результат 0 [[решетка];строк] ) рисовать линия [[решетка];коорд_гор_1] [смещение] [[решетка];коорд_гор_2] [смещение] увеличить смещение [[решетка];ширина_ячейки] следующий конец рисовать добавитьСенсор [[решетка];коорд_гор_1] [[решетка];коорд_вер_1] [[решетка];коорд_гор_2] [[решетка];коорд_вер_2] [решетка] возврат функция Решетка_определить_ячейку решетка х у вычислить - х $ [[решетка];коорд_гор_1] вычислить делитьЦелое гор [х] [[решетка];ширина_ячейки] увеличить гор вычислить - у $ [[решетка];коорд_вер_1] вычислить делитьЦелое вер [у] [[решетка];высота_ячейки] увеличить вер * показать сообщение "[гор] [вер]" присвоить $результат "[гор];[вер]" возврат функция Решетка_рисовать_фигуру решетка фигура гор вер цвет текст увеличить гор -1 увеличить вер -1 вычислить + гор_1 [[решетка];коорд_гор_1] (вычислить * $результат [гор] [[решетка];ширина_ячейки] ) вычислить + вер_1 [[решетка];коорд_вер_1] (вычислить * $результат [вер] [[решетка];высота_ячейки] ) вычислить + гор_2 [гор_1] [[решетка];ширина_ячейки] вычислить + вер_2 [вер_1] [[решетка];высота_ячейки] если [[решетка];толщина_линии] > 0 увеличить гор_1 1 увеличить вер_1 1 конец присвоить $ЦветКисти [цвет] $ЦветЛинии [цвет] присвоить $ТипКисти 1 $ТипЛинии 1 $ТолщинаЛинии 1 выбрать [фигура] вариант ячейка рисовать прямоугольник [гор_1] [вер_1] [гор_2] [вер_2] вариант круг рисовать круг [гор_1] [вер_1] [гор_2] [вер_2] вариант окружность присвоить $ТипКисти 2 $ТолщинаЛинии 3 рисовать круг [гор_1] [вер_1] [гор_2] [вер_2] вариант текст рисовать текстВПрямоугольнике [гор_1] [вер_1] [гор_2] [вер_2] [текст] другойВариант показать сообщение "Не умею рисовать [фигура]." конецВыбора возврат функция Решетка_написать_слово решетка гор вер направление текст для (строка кСписку $результат [текст] ) Решетка_рисовать_фигуру [решетка] текст [гор] [вер] [[решетка];цвет_фона] [$ОбъектЦикла] выбрать [направление] вариант гор увеличить гор вариант вер увеличить вер другойВариант увеличить гор увеличить вер конецВыбора следующий возврат